#ifndef __WHT20_I2C_H
#define __WHT20_I2C_H

#include <Arduino.h>
#include <Wire.h>          //   i2c的API库

#define SDA 8
#define SCL 19
#define WHT20_DEFAULT_ADDRESS 0x38
#define AD7193_EN_PIN 47

enum registers{
    WHT20_reg_read_one_byte_command = 0x71,
    WHT20_reg_initialize_command = 0xBE,
    WHT20_reg_measure_trigger_command = 0xAC,
    sfe_WHT20_reg_reset = 0xBA,
};

class WHT20{
    private:
    uint8_t _deviceAddress;
    bool measurementStarted = false;

    struct{
        uint32_t humidity;
        uint32_t temperature;
    }sensorData;

    struct{
        uint8_t humidity : 1;
        uint8_t temperature : 1;
    }sensorQueried;


    public:
    explicit WHT20(const uint8_t deviceAddress = WHT20_DEFAULT_ADDRESS);
    /******************设备状态*****************/
    //将设备连接到I2C总线，完成读取温湿度之前的工作（校准检验）
    //连接正常，状态字的校准使能位bit3为1（校准检验正常），则返回1，否则返回0
    bool begin();                 //设置设备的地址

    //检测WHT20是否连接到了I2C总线
    //正确连接返回：true
    //连接失败返回false
    bool isConnected();           //检查WHT20是否连接到了I2C总线           

    /************************************测量帮助函数**************************************/
    //获得显示WHT20状态的一个字节，返回的是WHT20接到命令后给的状态字
    uint8_t getStatus();


    //检查状态字的校准使能位（calibrated bit）
    //返回状态字的校准使能位bit[3]
    bool isCalibrated();

    // Returns the state of the busy bit in the status byte
    //返回状态字的忙状态标志位bit7，在忙返回0，WHT20已经测量完成返回1
    bool isBusy();

    //状态字的校准使能位不为1后的初始化操作，初始化成功返回1
    bool initialize();

    //触发WHT20进行测量，命令为0xAC，命令参数为0x33，0x00
    //触发成功返回1，否则返回0
    bool triggerMeasurement();

    /********************上面是测量前的准备工作，现在开始为获取温湿度数据做准备**************/
    // 读取6个字节的数据，丢弃第一个字节的状态字，将剩下的5个字节的数据分别赋值给温度湿度data
    void readData();

    // Triggers a measurement if one has not been previously started, then returns false
    // If measurement has been started, checks to see if complete.
    // If not complete, returns false
    // If complete, readData(), mark measurement as not started, return true
    //判断是否有新数据可用，如果有，则返回1
    bool available();

    //软件复位WHT20传感器
    bool softReset();

    /**********************************开始测量*****************************************/
    float getTemperature();

    float getHumidity();
};



#endif  /*__WHT20_I2C_H*/